package com.ccnf.service;

import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.ccnf.model.entity.*;
import com.ccnf.model.pojo.Report;

import java.util.List;
import java.util.Map;

public interface InvitationRecordService extends IService<InvitationRecord> {

    /**
     * 获取当前用户所有邀请函总统计数据（今日和总的统计数据），包含浏览，登记，入场
     * @param expoId 展会ID
     * @param userId 当前用户ID
     * @param type 统计的字段
     */
    List<Map<String, Object>> findTotalRecordByUserId(Long expoId, Long userId, Integer type);

    /**
     * 获取用户创建的所有邀请函的统计排行数据，包含浏览，登记，入场和是否关注该邀请函
     * @param page 分页参数
     * @param expoId 展会ID
     * @param userId 当前用户ID
     * @param type 0：浏览，1：登记，2：入场，3：关注
     * @param recordType 记录类型（0：总，1：今日）
     */
    Page<Map<String, Object>> findRecordsByUserId(Page page, Long expoId, Long userId, Integer recordType, Integer type);

    /**
     * 查询创建者的统计数据排行数据，包含浏览，登记，入场，关注
     * @param page 分页参数
     * @param userId 当前用户ID
     * @param type 0：浏览，1：登记，2：入场，3：关注
     */
    Page<Map<String, Object>> findAllExhibitorRecordsByUserId(Page page, Long expoId, Long userId, Integer type);

    /**
     * 更新用户关注自身邀请函
     * @param invitationRecord 邀请函关注数据
     * @return 返回影响的数据行数
     */
    void modifyStarStatus(InvitationRecord invitationRecord);

    /**
     * 录入用户关注记录数据
     * @param starRecord
     */
    void saveUserStar(StarRecord starRecord);

    /**
     * 录入邀请函用户通过该邀请函进行登记记录数据
     * @param invitationRegister
     */
    void saveInvitationUserRegister(InvitationRegister invitationRegister);

    /**
     * 录入邀请函用户通过该邀请函进行入场记录数据
     * @param registerId 登记ID
     */
    void updateInvitationUserEnter(String registerId);

    /**
     * 通过邀请函ID获取邀请函用户的记录排行数据
     * @param page 分页参数
     * @param invitationId 邀请函ID
     * @param userId 当前用户ID，用户判断是否关注客户状态
     */
    Page<Map<String, Object>> findInvitationUserList(Page page, Long invitationId, Long userId);

    /**
     * 通过邀请函ID获取邀请函用户的记录排行数据，不带分页，用户邮件导出使用
     * @param invitationId 邀请函ID
     * @param userId 当前用户ID，用户判断是否关注客户状态
     */
    List<Map<String, Object>> findInvitationAllUserList(Long invitationId, Long userId);

    /**
     * 通过邀请函ID获取邀请函的报表数据
     * @param invitationId 邀请函ID
     * @param reportType 报表类型（0：浏览，1：登记，2：入场，3：收藏）
     * @param timeType 时间区间类型（0：月，1：周）
     */
    List<Report> findInvitationReportByInvitationId(Long invitationId, Integer reportType, Integer timeType);

    Page<Map<String, Object>> findInvitationOrientationRank(Long invitationId, Integer type, Integer recordType, Long date, Page page);

    Map<String, Object> findInvitationOrientationCurrentUserRank(Long invitationId, Long userId, Integer type, Integer recordType, Long date);

    Page<Map<String, Object>> findInvitationRecordRank(Long referenceId, Integer type, Long endTime, Page page);
}